#include <stdio.h>
#include <stdlib.h>
/*
void* calloc(size_t nmemb, size_t size);
    功能: 在栈中分配 nmemb*size 字节的连续空间,自动将分配的内存置0
    参数: 
        nmemb: 所需内存单元数量
        size: 每个内存单元的大小
    返回值:
        成功: 分配空间的起始地址
        失败: NULL
*/
void test01()
{
    int* p = calloc(10, sizeof(int));
    for (size_t i = 0; i < 10; ++i){
        p[i] = i +1;
    }
    for (size_t i = 0; i < 10; ++i){
        printf("%d ", p[i]);
    }
    
    if(NULL != p){
        free(p);
        p = NULL;
    }
}

/*
void realloc(void* ptr, size_t size);
    功能: 
                重新分配用malloc或者calloc函数在堆中分配内存空间的大小
                relloc不会自动清理增加的内存,需要手动清理
                如果指定的地址后面有连续的空间,那么就会在已有地址基础上增加内存
                如果指定的地址后面没有空间,那么就会重新分配新的连续内存,把旧内存的值拷贝到新内存,同时释放旧内存
    参数:
                ptr: 为之前用malloc或者calloc分配的内存地址,如果次参数为NULL, 那么realloc与malloc功能一致
                size: 为重新分配内存大小, 单位: 字节
    返回值:
                成功: 新分配的堆内存地址
                失败: 返回NULL
*/
void test02()
{
    int *p = malloc(sizeof(int) * 10);
    for (size_t i = 0; i < 10; ++i){
        p[i] = i+1;
    }

    for (size_t i = 0; i < 10; ++i){
        printf("%d ", p[i]);
    }
    printf("\n");
    
    printf("%p\n", p);
    p = realloc(p, sizeof(int)*40);
    printf("%p\n", p);

    for (size_t i = 0; i < 15; ++i){
        printf("%d ", p[i]);
    }
    printf("\n");
}

int main(int argc, char const *argv[])
{
    // test01();
    test02();
    return 0;
}
